<?php

/* It is not allowed to create an instance of a class that has been defined as abstract.
 * Any class that contains at least one abstract method must also be abstract. Methods defined 
 * as abstract simply declare the method's signature they cannot define the implementation. 
 */
 
	abstract class AbstractClass
	{
		// Force Extending class to define this method
		abstract protected function getValue();
		abstract protected function prefixValue($prefix);

		// Common method
		public function printOut() {
			print $this->getValue() . "<br/>";
		}
	}

	class ConcreteClass1 extends AbstractClass
	{
		protected function getValue() {
			return "ConcreteClass1";
		}

		public function prefixValue($prefix) {
			return "{$prefix}ConcreteClass1";
		}
	}

	class ConcreteClass2 extends AbstractClass
	{
		
		public function getValue() {
			return "ConcreteClass2";
		}
		
		public function prefixValue($prefix) {
			return "{$prefix}ConcreteClass2";
		}
	}

	$class1 = new ConcreteClass1;
	//$class1->printOut();
	//echo $class1->prefixValue('FOO_') ."\n";

	$class2 = new ConcreteClass2;
	//$class2->printOut();
	//echo $class2->prefixValue('FOO_') ."\n";

?>
